package com.sdtv.mediunfusion.mvp.ui.home.fragment;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.CircleOptions;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.Stroke;
import com.baidu.mapapi.map.TextureMapView;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.utils.DistanceUtil;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.sdtv.basemodule.annotations.CreatePresenter;
import com.sdtv.basemodule.annotations.PresenterVariable;
import com.sdtv.basemodule.base.BaseActivity;
import com.sdtv.basemodule.base.BaseFragment;
import com.sdtv.basemodule.bean.Results;
import com.sdtv.basemodule.router.ARouterUtils;
import com.sdtv.basemodule.utils.ClickProxy;
import com.sdtv.mediunfusion.R;
import com.sdtv.mediunfusion.base.config.MediumApplication;
import com.sdtv.mediunfusion.bean.PunchBean;
import com.sdtv.mediunfusion.bean.UserIdentify;
import com.sdtv.mediunfusion.mvp.contract.MainContract;
import com.sdtv.mediunfusion.mvp.presenter.PunchPresenter;
import com.sdtv.mediunfusion.utils.RequestCode;
import com.sdtv.mediunfusion.utils.RouterPath;
import com.sdtv.mediunfusion.utils.SendLocationHelper;

import java.util.List;

import butterknife.BindView;

/**
 * @ProjectName: MediunFusion
 * @Package: com.sdtv.mediunfusion.mvp.home.fragment
 * @ClassName: PunchFragment
 * @Description: 打卡页面 --调试
 * @Author: 小郭同学
 * @CreateDate: 2019-07-25 17:02
 * @UpdateRemark: 更新说明
 * @Version: 1.0
 */
@CreatePresenter(presenter = PunchPresenter.class)
public class PunchFragment extends BaseFragment implements
        SendLocationHelper.MapListener, MainContract.PunchView {

    private static PunchFragment instance;

    @BindView(R.id.bmapView)
    TextureMapView mMapView;
    @BindView(R.id.punch_textView)
    TextView punchTextView;
    @BindView(R.id.punch_timeView)
    TextView punchTimeView;
    @BindView(R.id.punchView)
    LinearLayout punchView;
    @BindView(R.id.punch_tipTimeView)
    TextView punchTipTimeView;
    // 获取presenter对象
    @PresenterVariable
    PunchPresenter punchPresenter;
    //百度地图
    private BaiduMap baiduMap;
    // 获取定位信息
    private SendLocationHelper locationHelper;
    //时间 定位 获取类
    private UserIdentify userIdentify = new UserIdentify();
    // 是不是上班打卡
    private boolean isAm = true;
    //规定打卡区域
    private LatLng stipulateLatLng;
    //当前打卡区域
    private LatLng cuttentLatLng;
    //当前打卡地址
    private String address;
    /**
     * 时钟 计时器
     */
    @SuppressLint("HandlerLeak")
    private Handler mHander = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (!((BaseActivity) mContext).isFinishing()) {
                //获取系统时间
                long sysTime = System.currentTimeMillis();
                //时间显示格式
                CharSequence sysTimeStr = DateFormat.format("HH:mm:ss", sysTime);
                punchTimeView.setText(sysTimeStr); //更新时间
            }
        }
    };
    /**
     * 轮询任务--
     */
    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            mHander.sendEmptyMessage(0);
            mHander.postDelayed(runnable, 1000);
        }
    };
    /**
     * 点击事件
     * <p>
     * 避免连续点击
     */
    private ClickProxy clickProxy = new ClickProxy(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.punchView:
                    //如果当前显示为上班打卡 则将时间设置为下班打卡  否则不更改提示  只向server传递数据
                    //将当前打卡时间 传递给后台-
                    long sysTime = System.currentTimeMillis();//获取系统时间
                    CharSequence sysTimeStr = DateFormat.format("yyyy-MM-dd HH:mm:ss", sysTime);//时间显示格式
                    double distance = DistanceUtil.getDistance(stipulateLatLng, cuttentLatLng);
                    // 如果不在区域内 跳转到区域外备注-打卡
                    if ((Math.abs(distance) < 500)) {
                        ToastUtils.showShort(R.string.outsideArea_tips);
                        // 跳转到备注 --
                        Bundle bundle = new Bundle();
                        bundle.putString("address", address);
                        bundle.putString("time", sysTimeStr.toString());
                        ARouterUtils.navigation(RouterPath.TO_PUNCHREMARK_ACTIVITY, bundle, (Activity) mContext,
                                RequestCode.PUNCH_REMARK_CODE);
                    } else {
                        punchPresenter.submitTime(address, "0", sysTimeStr.toString(), "");
                    }
                    break;
                default:
            }
        }
    });

    /**
     * 设置页面单例模式
     *
     * @return
     */
    public static PunchFragment getInstance() {
        if (null == instance) {
            synchronized (PunchFragment.class) {
                if (null == instance) {
                    instance = new PunchFragment();
                }
            }
        }
        return instance;
    }

    /**
     * 设置布局文件
     *
     * @return
     */
    @Override
    public int getLayoutId() {
        return R.layout.fragment_punch_layout;
    }

    /**
     * 初始化页面view
     */
    @Override
    public void initView() {
        //设置按钮的点击事件
        punchView.setOnClickListener(clickProxy);

    }

    /**
     * 初始化页面数据
     */
    @Override
    public void initData() {
        // 获取今天的打卡记录
        long sysTime = System.currentTimeMillis();//获取系统时间
        CharSequence sysTimeStr = DateFormat.format("yyyy-MM-dd", sysTime);//时间显示格式
        punchPresenter.getPunchLogging(sysTimeStr.toString());
    }

    /**
     * 设置规定的打卡区域
     */
    private void initMapstipulateLocation() {
        // 百度地图基础设置
        baiduMap = mMapView.getMap();
        //开启定位图层
        baiduMap.setMyLocationEnabled(true);
        //设置定位图标 --
        BitmapDescriptor bitmap = BitmapDescriptorFactory
                .fromResource(R.mipmap.ic_dingwei);
        MyLocationConfiguration configuration = new MyLocationConfiguration(
                MyLocationConfiguration.LocationMode.NORMAL, false, bitmap);
        configuration.accuracyCircleStrokeColor = Color.TRANSPARENT;
        configuration.accuracyCircleFillColor = Color.TRANSPARENT;
        baiduMap.setMyLocationConfiguration(configuration);
        // 设置规定的打卡区域  画圆 -- 绘制可打卡区域 ---  圆心
        String location = userIdentify.getPunchLocation();
        if (!TextUtils.isEmpty(location)) {
            String array[] = location.split(",");
            stipulateLatLng = new LatLng(Double.parseDouble(array[1]), Double.parseDouble(array[0]));
        } else {
            //定位到轻快大本营
            stipulateLatLng = new LatLng(36.655428, 117.03726);
        }
        //构造CircleOptions对象
        CircleOptions mCircleOptions = new CircleOptions().center(stipulateLatLng)
                .radius(500)
                .fillColor(0x290092fa)//填充颜色
                .stroke(new Stroke(1, 0xAA00FF00)); //边框宽和边框颜色
        //在地图上显示圆
        baiduMap.addOverlay(mCircleOptions);
        // 获取当前定位的位置
        locationHelper = SendLocationHelper.getInstance(MediumApplication.getContext());
        // 如果当前已经启动了定位服务 则先停止  停止连续打点 --
        locationHelper.stopGetLocation();
    }

    /**
     * 设置生命周期
     */
    @Override
    public void onResume() {
        //在activity执行onResume时执行mMapView. onResume ()，
        // 实现地图生命周期管理
        mMapView.onResume();
        super.onResume();
    }

    @Override
    public void onPause() {
        //在activity执行onPause时执行mMapView. onPause ()，
        // 实现地图生命周期管理
        mMapView.onPause();
        super.onPause();

    }

    /**
     * 释放地图资源
     */
    public void releaseMap() {
        mMapView.onDestroy();
        baiduMap.setMyLocationEnabled(false);
        mMapView = null;
        if (null != mHander && null != runnable) {
            mHander.removeCallbacks(runnable);
        }
        //去掉监听事件
        locationHelper.setMapListener(null);
    }


    /**
     * 当页面可见时
     * 开始定位
     */
    @Override
    public void onVisible() {
        LogUtils.e("页面可见时，开启定位设置");
        initMapstipulateLocation();
        mHander.post(runnable);
        // 获取当前定位的位置
        locationHelper.setMapListener(this);
        locationHelper.startGetLngAndLat();
    }

    /**
     * 当页面不可见的时候
     * 取消定位
     */
    @Override
    public void onInvisible() {
        LogUtils.e("页面不可见时，关闭定位");
        baiduMap.setMyLocationEnabled(false);
        if (null != mHander && null != runnable) {
            mHander.removeCallbacks(runnable);
        }
        //暂停定位事件
        locationHelper.stopGetLocation();
    }

    /**
     * 地图定位监听
     *
     * @param locationData
     * @param location     具体位置
     */
    @Override
    public void loadPosition(MyLocationData locationData, String location) {
        baiduMap.setMyLocationData(locationData);
        cuttentLatLng = new LatLng(locationData.latitude, locationData.longitude);
        // 设置缩放比例
        baiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLngZoom(cuttentLatLng, 16f));
        // 不在区域外  显示图层提示信息
        if (Math.abs(DistanceUtil.getDistance(stipulateLatLng, cuttentLatLng)) > 500) {
            Button button = new Button(MediumApplication.getContext());
            button.setBackgroundResource(R.mipmap.ic_buzaifanwei);
            //构造InfoWindow
            //cuttentLatLng 描述的位置点
            //-40 InfoWindow相对于point在y轴的偏移量
            InfoWindow mInfoWindow = new InfoWindow(button, cuttentLatLng, -40);
            //使InfoWindow生效
            baiduMap.showInfoWindow(mInfoWindow);
        }
        //当前地址
        this.address = location;
    }

    /**
     * 设置用户今天的打卡信息
     * --有数据 说明今天打过卡  则根据打卡时间来设置显示的标示
     * -没有数据 则说明今天未打卡，需要根据后台设置时间 来判定显示按钮的提示语
     *
     * @param loggingList
     */
    @Override
    public void setUserPunchInfo(List<PunchBean> loggingList) {
        if (loggingList.isEmpty()) {
            ToastUtils.showShort("没有当天的打卡记录---");
            setTips(true);
        } else {
            // 设置当前的打卡状态
            setTips(false);
        }
    }

    /**
     * 正常打卡返回
     *
     * @param response
     */
    @Override
    public void result(Results response) {

    }

    /**
     * 异常打卡返回提示
     */
    @Override
    public void punchFail() {
        ToastUtils.showShort(R.string.pubch_fail);
    }


    /**
     * 设置打卡提示 以及 打卡时间
     *
     * @param am 是不是上班打卡  true：上班打卡  false:下班打卡
     */
    private void setTips(boolean am) {
        if (am) {
            isAm = true;
            //今天尚未打开 显示为 上班打卡
            punchTextView.setText("上班打卡");
            //x显示规定的上班打卡时间
            if (!TextUtils.isEmpty(userIdentify.getInTime())) {
                punchTipTimeView.setText(userIdentify.getInTime());
            } else {
                punchTipTimeView.setText("8:00");
            }
        } else {
            isAm = false;
            punchTextView.setText("下班打卡");
            //x显示规定的上班打卡时间
            if (!TextUtils.isEmpty(userIdentify.getOutTime())) {
                punchTipTimeView.setText(userIdentify.getOutTime());
            } else {
                punchTipTimeView.setText("17:00");
            }
        }
    }

    /**
     * 跳转到备注之后 返回来 刷新页面
     *
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK && requestCode == RequestCode.PUNCH_REMARK_CODE) {
            String result = data.getStringExtra("punch_result");
            // 如果是上班打卡成功--需要设置为下班打卡 - 否则 不进行处理
            if ("success".equals(result)) {
                if (isAm) {
                    setTips(false);
                }
            }
        }
    }

}
